// File: jmcomic-cli/src/main/java/dev/jukomu/jmcomic/cli/JmcomicCliMain.java
package dev.jukomu.jmcomic.cli;

import dev.jukomu.jmcomic.api.JmcomicApi;
import dev.jukomu.jmcomic.config.JmModuleConfig;
import dev.jukomu.jmcomic.option.JmOption;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * 对应Python的cl.py，是JMComic的命令行界面入口。
 */
public class JmcomicCliMain {

    private String optionPath;
    private final List<String> rawIdList = new ArrayList<>();
    private final List<String> albumIdList = new ArrayList<>();
    private final List<String> photoIdList = new ArrayList<>();

    /**
     * 解析命令行参数。
     *
     * @param args 命令行参数数组。
     */
    public void parseArgs(String[] args) {
        Options options = new Options();

        // 定义 --option 参数
        Option optionOpt = new Option("o", "option", true, "配置文件路径。也可以通过环境变量 JM_OPTION_PATH 指定。");
        optionOpt.setArgName("file");
        options.addOption(optionOpt);

        // 定义 --help 参数
        options.addOption("h", "help", false, "显示此帮助信息。");

        CommandLineParser parser = new DefaultParser();
        HelpFormatter formatter = new HelpFormatter();
        CommandLine cmd;

        try {
            cmd = parser.parse(options, args);
        } catch (ParseException e) {
            System.err.println(e.getMessage());
            formatter.printHelp("java -jar jmcomic-cli.jar [id_list] [options]", options);
            System.exit(1);
            return;
        }

        if (cmd.hasOption("help")) {
            formatter.printHelp("java -jar jmcomic-cli.jar [id_list] [options]", options);
            System.exit(0);
        }

        // 获取 --option 参数值
        String optionValue = cmd.getOptionValue("option");
        if (optionValue == null || optionValue.isEmpty()) {
            optionValue = System.getenv("JM_OPTION_PATH"); // 尝试从环境变量获取
        }

        if (optionValue != null && !optionValue.isEmpty()) {
            this.optionPath = new File(optionValue).getAbsolutePath();
        } else {
            this.optionPath = null;
        }

        // 获取剩余的参数作为ID列表
        rawIdList.addAll(cmd.getArgList());
        parseRawIds();
    }

    /**
     * 解析原始ID列表，区分本子ID和章节ID。
     */
    private void parseRawIds() {
        for (String rawId : rawIdList) {
            try {
                if (rawId.toLowerCase().startsWith("p")) {
                    photoIdList.add(dev.jukomu.jmcomic.util.JmcomicText.parseToJmId(rawId.substring(1)));
                } else if (rawId.toLowerCase().startsWith("a")) {
                    albumIdList.add(dev.jukomu.jmcomic.util.JmcomicText.parseToJmId(rawId.substring(1)));
                } else {
                    albumIdList.add(dev.jukomu.jmcomic.util.JmcomicText.parseToJmId(rawId));
                }
            } catch (Exception e) {
                System.err.println("无法解析ID '" + rawId + "': " + e.getMessage());
                System.exit(1);
            }
        }
    }

    /**
     * 运行下载任务。
     */
    public void run() {
        JmModuleConfig.jmLog("command_line", String.format(
                "开始下载...\n- 使用配置文件: [%s]\n待下载:\n- 本子: %s\n- 章节: %s",
                (optionPath != null ? optionPath : "默认配置"),
                albumIdList,
                photoIdList
        ));

        JmOption option;
        if (optionPath != null) {
            option = JmcomicApi.createOption(optionPath);
        } else {
            option = JmOption.defaultOption();
        }

        // 使用CompletableFuture来并发执行本子和章节的下载
        List<CompletableFuture<Void>> futures = new ArrayList<>();

        if (!albumIdList.isEmpty()) {
            futures.add(CompletableFuture.runAsync(() -> {
                JmcomicApi.downloadAlbum(albumIdList, option);
            }));
        }

        if (!photoIdList.isEmpty()) {
            futures.add(CompletableFuture.runAsync(() -> {
                JmcomicApi.downloadPhoto(photoIdList, option);
            }));
        }

        // 等待所有任务完成
        if (!futures.isEmpty()) {
            CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
        }

        JmModuleConfig.jmLog("command_line", "所有下载任务已完成。");
    }

    /**
     * 主函数入口。
     *
     * @param args 命令行参数。
     */
    public static void main(String[] args) {
        JmcomicCliMain cli = new JmcomicCliMain();
        cli.parseArgs(args);
        cli.run();
    }
}